home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Cafe 3
/
Visual Cafe 3.ISO
/
Vcafe
/
JFC.bin
/
LookAndFeel.java
< prev
next >
Wrap
Text File
|
1998-06-30
|
10KB
|
277 lines
/*
* @(#)LookAndFeel.java 1.9 98/01/30
*
* Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
* SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*
*/
package com.sun.java.swing;
import java.awt.Font;
import java.awt.Color;
import java.awt.SystemColor;
import com.sun.java.swing.plaf.basic.*;
import com.sun.java.swing.BorderFactory;
import com.sun.java.swing.JComponent;
import com.sun.java.swing.ImageIcon;
import com.sun.java.swing.UIDefaults;
import com.sun.java.swing.UIManager;
import com.sun.java.swing.border.*;
import com.sun.java.swing.plaf.*;
import java.net.URL;
import java.io.*;
/**
* Completely characterizes a look and feel from the point of view
* of the pluggable look and feel components.
*
* @version 1.9 01/30/98
* @author Tom Ball
* @author Hans Muller
*/
public abstract class LookAndFeel
{
/**
* Convenience method for initializing a component's foreground
* and background color properties with values from the current
* defaults table. The properties are only set if the current
* value is either null or a UIResource.
*
* @param c the target component for installing default color/font properties
* @param defaultBgName the key for the default background
* @param defaultFgName the key for the default foreground
*
* @see #installColorsAndFont
* @see UIManager#getColor
*/
public static void installColors(JComponent c,
String defaultBgName,
String defaultFgName)
{
Color bg = c.getBackground();
if (bg == null || bg instanceof UIResource) {
c.setBackground(UIManager.getColor(defaultBgName));
}
Color fg = c.getForeground();
if (fg == null || fg instanceof UIResource) {
c.setForeground(UIManager.getColor(defaultFgName));
}
}
/**
* Convenience method for initializing a components foreground
* background and font properties with values from the current
* defaults table. The properties are only set if the current
* value is either null or a UIResource.
*
* @param c the target component for installing default color/font properties
* @param defaultBgName the key for the default background
* @param defaultFgName the key for the default foreground
* @param defaultFontName the key for the default font
*
* @see #installColors
* @see UIManager#getColor
* @see UIManager#getFont
*/
public static void installColorsAndFont(JComponent c,
String defaultBgName,
String defaultFgName,
String defaultFontName) {
Font f = c.getFont();
if (f == null || f instanceof UIResource) {
c.setFont(UIManager.getFont(defaultFontName));
}
installColors(c, defaultBgName, defaultFgName);
}
/**
* Convenience method for installing a component's default Border
* object on the specified component if either the border is
* currently null or already an instance of UIResource.
* @param c the target component for installing default border
* @param defaultBorderName the key specifying the default border
*/
public static void installBorder(JComponent c, String defaultBorderName) {
Border b = c.getBorder();
if (b == null || b instanceof UIResource) {
c.setBorder(UIManager.getBorder(defaultBorderName));
}
}
/**
* Convenience method for un-installing a component's default
* border on the specified component if the border is
* currently an instance of UIResource.
* @param c the target component for uninstalling default border
*/
public static void uninstallBorder(JComponent c) {
if (c.getBorder() instanceof UIResource) {
c.setBorder(null);
}
}
/**
* Utility method that creates a UIDefaults.LazyValue that creates
* an ImageIcon UIResource for the specified <code>gifFile</code>
* filename.
*/
public static Object makeIcon(final Class baseClass, final String gifFile) {
return new UIDefaults.LazyValue() {
public Object createValue(UIDefaults table) {
byte[] buffer = null;
try {
/* Copy resource into a byte array. This is
* necessary because several browsers consider
* Class.getResource a security risk because it
* can be used to load additional classes.
* Class.getResourceAsStream just returns raw
* bytes, which we can convert to an image.
*/
InputStream resource =
baseClass.getResourceAsStream(gifFile);
if (resource == null) {
System.err.println(baseClass.getName() + "/" +
gifFile + " not found.");
return null;
}
BufferedInputStream in =
new BufferedInputStream(resource);
ByteArrayOutputStream out =
new ByteArrayOutputStream(1024);
buffer = new byte[1024];
int n;
while ((n = in.read(buffer)) > 0) {
out.write(buffer, 0, n);
}
in.close();
out.flush();
buffer = out.toByteArray();
if (buffer.length == 0) {
System.err.println("warning: " + gifFile +
" is zero-length");
return null;
}
} catch (IOException ioe) {
System.err.println(ioe.toString());
return null;
}
return new IconUIResource(new ImageIcon(buffer));
}
};
}
/**
* Return a short string that identifies this look and feel, e.g.
* "CDE/Motif". This string should be appropriate for a menu item.
* Distinct look and feels should have different names, e.g.
* a subclass of MotifLookAndFeel that changes the way a few components
* are rendered should be called "CDE/Motif My Way"; something
* that would be useful to a user trying to select a L&F from a list
* of names.
*/
public abstract String getName();
/**
* Return a string that identifies this look and feel. This string
* will be used by applications/services that want to recognize
* well known look and feel implementations. Presently
* the well known names are "Motif", "Windows", "Mac", "Organic". Note
* that a derived LookAndFeel that doesn't make any fundamental changes
* to the look or feel should not override this method.
*/
public abstract String getID();
/**
* Return a one line description of this look and feel implementation,
* e.g. "The CDE/Motif Look and Feel". This string is intended for
* the user, e.g. in the title of a window or in a ToolTip message.
*/
public abstract String getDescription();
/**
* If the underlying platform has a "native" look and feel, and this
* is an implementation of it, return true. For example a CDE/Motif
* look and implementation would return true when the underlying
* platform was Solaris.
*/
public abstract boolean isNativeLookAndFeel();
/**
* Return true if the underlying platform supports and or permits
* this look and feel. This method returns false if the look
* and feel depends on special resources or legal agreements that
* aren't defined for the current platform.
*
* @see UIManager#setLookAndFeel
*/
public abstract boolean isSupportedLookAndFeel();
/**
* UIManager.setLookAndFeel calls this method before the first
* call (and typically the only call) to getDefaults(). Subclasses
* should do any one-time setup they need here, rather than
* in a static initializer, because look and feel class objects
* may be loaded just to discover that isSupportedLookAndFeel()
* returns false.
*
* @see #uninitialize
* @see UIManager#setLookAndFeel
*/
public void initialize() {
}
/**
* UIManager.setLookAndFeel calls this method just before we're
* replaced by a new default look and feel. Subclasses may
* choose to free up some resources here.
*
* @see #initialize
*/
public void uninitialize() {
}
/**
* This method is called once by UIManager.setLookAndFeel to create
* the look and feel specific defaults table. Other applications,
* for example an application builder, may also call this method.
*
* @see #initialize
* @see #uninitialize
* @see UIManager#setLookAndFeel
*/
public UIDefaults getDefaults() {
return null;
}
public String toString() {
return "[" + getDescription() + " - " + getClass().getName() + "]";
}
}